// const user = {
//   name: 'xm',
//   age: 16
// }

// const userProxy = new Proxy(user, {
//   // 监视属性的服务
//   get (target, property) {
//     console.log(`正在读取对象 ${JSON.stringify(target)} 的 ${property} 属性`)
//     return property in target ? target[property] : undefined
//   },
//   // 监视属性的设置
//   set (target, property, value) {
//     console.log(`正在为 ${JSON.stringify(target)} 的 ${property} 写入 ${value}`)
//     target[property] = value
//     return true
//   },
//   deleteProperty (target, property) {
//     console.log(`删除 ${JSON.stringify(target)} 的 ${property} 属性`)
//     delete target[property]
//   }
// })

// console.log(userProxy.age, userProxy.gender)
// userProxy.age = 14
// userProxy.addr = 'ddd'
// console.log(userProxy)
// delete userProxy.addr
// console.log(userProxy)


// const list = []

// const listProxp = new Proxy(list, {
//   set (target, index, value) {
//     console.log('set', index, value)
//     target[index] = value
//     return true
//   }
// })

// listProxp.push(123)

// const user = {
//   age: 17,
//   name: 'xm'
// }
// const userProxy = new Proxy(user, {})
// // 拿 get 方法来说，相当于
// const userProxy1 = new Proxy(user, {
//   get(target,property){
//     // Proxy 的正确做法是，自己实现监听逻辑，然后调用 Reflect 的方法
//     console.log('监听逻辑')
//     return Reflect.get(target,property)
//   }
// })
// console.log(userProxy1.age)
// console.log(userProxy1)


const user1 = {
  age: 17,
  name: 'xm'
}
// 操作对象，一会儿使用操作符号，一会儿使用某一个对象的方法
console.log('name' in user1)
console.log(delete user1.age)
console.log(Object.keys(user1))


const user2 = {
  age: 17,
  name: 'xm'
}
// Reflect 提供了统一的方式：都使用 Reflect 的方法
console.log(Reflect.has(user2,'name'))
console.log(Reflect.deleteProperty(user2,'name'))
console.log(Reflect.ownKeys(user2))